# Disable all of make's built-in rules (similar to Fortran's implicit none)
MAKEFLAGS += --no-builtin-rules --no-builtin-variables
# configuration
FC := gfortran # 编译器
LD := $(FC) # 链接器
RM := del /Q # 删除命令
# list of all source files
SRCS := tabulate.f90 functions.f90 # 源文件
PROG := my_prog # 可执行文件

OBJS := $(addsuffix .o, $(SRCS)) #  将源文件列表 SRCS 的每个文件名添加 .o 后缀，生成目标文件列表

.PHONY: all clean # 声明伪目标 all 和 clean，表示这些目标不会生成与之同名的文件
all: $(PROG) # all依赖于$(PROG)

$(PROG): $(OBJS) # $(PROG)依赖于$(OBJS)
	$(LD) -o $@ $^

# -c: 这个选项表示只编译源文件，而不进行链接。编译后会生成目标文件（即 .o 文件），而不会生成可执行文件
# 注意到OBJS是个文件列表，会循环运行
# $@表示当前目标，$<表示当前目标的依赖
$(OBJS): %.o: %
	$(FC) -c -o $@ $<

# define dependencies between object files
tabulate.f90.o: functions.f90.o user_functions.mod

# rebuild all object files in case this Makefile changes
$(OBJS): $(MAKEFILE_LIST)

clean:
	$(RM) $(filter %.o, $(OBJS)) $(wildcard *.mod) $(PROG).exe